Reset sp on vcpu_prepare; this avoids 'leaking' stack after repeated
authorsmh22@firebug.cl.cam.ac.uk <smh22@firebug.cl.cam.ac.uk>
Fri, 10 Feb 2006 16:57:13 +0000 (17:57 +0100)
committersmh22@firebug.cl.cam.ac.uk <smh22@firebug.cl.cam.ac.uk>
Fri, 10 Feb 2006 16:57:13 +0000 (17:57 +0100)
save/restore/migrate iterations.

Should fix various crashes observed with save/restore/migrate of multi
VCPU guests.

Signed-off-by: Steven Hand <steven@xensource.com>
linux-2.6-xen-sparse/drivers/xen/core/smpboot.c

index d231f8502976d602d0bba069ff4cd9add5b0b354..8f057f9f7c82e7277e32137d320cfb03f5b3a7c3 100644 (file)
@@ -176,7 +176,7 @@ void vcpu_prepare(int vcpu)
 
 #ifdef __i386__
        ctxt.user_regs.cs = __KERNEL_CS;
-       ctxt.user_regs.esp = idle->thread.esp;
+       ctxt.user_regs.esp = idle->thread.esp0 - sizeof(struct pt_regs);
 
        ctxt.kernel_ss = __KERNEL_DS;
        ctxt.kernel_sp = idle->thread.esp0;
@@ -187,9 +187,9 @@ void vcpu_prepare(int vcpu)
        ctxt.failsafe_callback_eip = (unsigned long)failsafe_callback;
 
        ctxt.ctrlreg[3] = virt_to_mfn(swapper_pg_dir) << PAGE_SHIFT;
-#else
+#else /* __x86_64__ */
        ctxt.user_regs.cs = __KERNEL_CS | 3;
-       ctxt.user_regs.esp = idle->thread.rsp;
+       ctxt.user_regs.esp = idle->thread.rsp0 - sizeof(struct pt_regs);
 
        ctxt.kernel_ss = __KERNEL_DS;
        ctxt.kernel_sp = idle->thread.rsp0;